<!doctype html>
<html lang="en-us">
<head>
	<meta name="generator" content="Hugo 0.63.2" />

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>刹宕博客 | 人如秋鸿来有信，事若春梦了无痕</title>
    <meta property="og:title" content="刹宕博客 | 人如秋鸿来有信，事若春梦了无痕">
    <meta property="og:type" content="website">
    <meta name="Keywords" content="java,系统架构,shutdown,孟江莱">
    <meta name="description" content="Java">
    <meta property="og:url" content="http://www.shutdown.cn/">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">

    <link rel="stylesheet" href='/css/normalize.css'>
    <link rel="stylesheet" href='/css/style.css'>
    <link rel="alternate" type="application/rss+xml+xml" href="http://www.shutdown.cn/index.xml" title="刹宕博客" />
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

    


    
    
</head>


<body>
    <header id="header" class="clearfix">
    <div class="container">
        <div class="col-group">
            <div class="site-name ">
                
                    <h1>
                        <a id="logo" href="http://www.shutdown.cn">
                            刹宕博客
                        </a>
                    </h1>
                
                <p class="description">人如秋鸿来有信，事若春梦了无痕</p>
            </div>
            <div>
                <nav id="nav-menu" class="clearfix">
                    <a class="current" href="http://www.shutdown.cn">首页</a>
                    
                    <a  href="http://www.shutdown.cn/tools/" title="工具">工具</a>
                    
                    <a  href="http://www.shutdown.cn/archives/" title="归档">归档</a>
                    
                    <a  href="http://www.shutdown.cn/about/" title="关于">关于</a>
                    
                </nav>
            </div>
        </div>
    </div>
</header>

    <div id="body">
        <div class="container">
            <div class="col-group">

                <div class="col-8" id="main">
                    
<div class="res-cons">
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/Idea%E5%88%A0%E9%99%A4%E5%A4%9A%E8%A1%8C/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            Mac Idea批量删除空行   1.在编辑框中使用快捷键command + R 打开替换框
  2.勾选正则模式 Regex
  3.在条件框中输入正则^\s*\n
正则解释，匹配以0个或n个\s空白符起首的换行\n
输入正则后可以看到效果，可以看到单行和多行都被选中了 。
如果想只删除连续多行的空行，就需要调整一下正则 ^\s*\n\s*\n就可以了
  点击Replace all进行批量替换
  ……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/Idea%E5%88%A0%E9%99%A4%E5%A4%9A%E8%A1%8C/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/iptables/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            在Linux服务器被攻击的时候，有的时候会有几个主力IP。如果能拒绝掉这几个IP的攻击的话，会大大减轻服务器的压力，说不定服务器就能恢复正常了。
在Linux下封停IP，有封杀网段和封杀单个IP两种形式。一般来说，现在的攻击者不会使用一个网段的IP来攻击（太招摇了），IP一般都是散列的。于是下面就详细说明一下封杀单个IP的命令，和解封单个IP的命令。
Linux防火墙：iptables禁IP与解封IP常用命令
在Linux下，使用ipteables来维护IP规则表。要封停或者是解封IP，其实就是在IP规则表中对入站部分的规则进行添加操作。
要封停一个IP，使用下面这条命令：
1  iptables -I INPUT -s ***.***.***.*** -j DROP   要解封一个IP，使用下面这条命令：
1  iptables -D INPUT -s ***.***.***.*** -j DROP   参数-I是表示Insert（添加），-D表示Delete（删除）。后面跟的是规则，INPUT表示入站，..***.***表示要封停的IP，DROP表示放弃连接。
此外，还可以使用下面的命令来查看当前的IP规则表：
1  iptables -list   比如现在要将123.44.55.66这个IP封杀，就输入：
1  iptables -I INPUT -s 123.44.55.66 -j DROP   要解封则将-I换成-D即可，前提是iptables已经有这条记录。如果要想清空封掉的IP地址，可以输入：
1  iptables -flush   要添加IP段到封停列表中，使用下面的命令：
1  iptables -I INPUT -s 121.0.0.0/8 -j DROP   其实也就是将单个IP封停的IP部分换成了Linux的IP段表达式。关于IP段表达式网上有很多详细解说的，这里就不提了。
相信有了iptables的帮助，解决小的DDoS之类的攻击也不在话下！
附：其他常用的命令
编辑 iptables 文件
1  vi /etc/sysconfig/iptables   关闭/开启/重启防火墙
1 2 3  /etc/init.d/iptablesstop #start 开启 #restart 重启   验证一下是否规则都已经生效：
1  iptables -L   保存并重启iptables
1 2  /etc/rc.d/init.d/iptablessave service iptables restart   linux下实用iptables封ip段的一些常见命令：
封单个IP的命令是：
1  iptables -I INPUT -s 211.1.0.0 -j DROP   封IP段的命令是：
1 2 3  iptables -I INPUT -s 211.1.0.0/16 -j DROP iptables -I INPUT -s 211.2.0.0/16 -j DROP iptables -I INPUT -s 211.……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/iptables/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/JedisPool%E8%B5%84%E6%BA%90%E6%B1%A0%E4%BC%98%E5%8C%96/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            JedisPool资源池优化 合理的JedisPool资源池参数设置能够有效地提升Redis性能。本文档将对JedisPool的使用和资源池的参数进行详细说明，并提供优化配置的建议。
使用方法 以Jedis 2.9.0为例，其Maven依赖如下：
1 2 3 4 5 6  &lt;dependency&gt; &lt;groupId&gt;redis.clients&lt;/groupId&gt; &lt;artifactId&gt;jedis&lt;/artifactId&gt; &lt;version&gt;2.9.0&lt;/version&gt; &lt;scope&gt;compile&lt;/scope&gt; &lt;/dependency&gt;   Jedis使用Apache Commons-pool2对资源池进行管理，在定义JedisPool时需注意其关键参数GenericObjectPoolConfig（资源池）。该参数的使用示例如下，其中的参数的说明请参见下文。
1 2 3 4 5 6  GenericObjectPoolConfig jedisPoolConfig = new GenericObjectPoolConfig(); jedisPoolConfig.setMaxTotal(...); jedisPoolConfig.setMaxIdle(...); jedisPoolConfig.setMinIdle(...); jedisPoolConfig.setMaxWaitMillis(...); ...   JedisPool的初始化方法如下：
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  // redisHost为实例的IP， redisPort 为实例端口，redisPassword 为实例的密码，timeout 既是连接超时又是读写超时 JedisPool jedisPool = new JedisPool(jedisPoolConfig, redisHost, redisPort, timeout, redisPassword//); //执命令如下 Jedis jedis = null; try { jedis = jedisPool.getResource(); //具体的命令  jedis.executeCommand() } catch (Exception e) { logger.error(e.getMessage(), e); } finally { //在 JedisPool 模式下，Jedis 会被归还给资源池  if (jedis != null) jedis.close(); }   参数说明 Jedis连接就是连接池中JedisPool管理的资源，JedisPool保证资源在一个可控范围内，并且保障线程安全。使用合理的GenericObjectPoolConfig配置能够提升Redis的服务性能，降低资源开销。下列两表将对一些重要参数进行说明，并提供设置建议。
   参数 说明 默认值 建议     maxTotal 资源池中的最大连接数 8 参见关键参数设置建议。   maxIdle 资源池允许的最大空闲连接数 8 参见关键参数设置建议。   minIdle 资源池确保的最少空闲连接数 0 参见关键参数设置建议。   blockWhenExhausted 当资源池用尽后，调用者是否要等待。只有当值为true时，下面的maxWaitMillis才会生效。 true 建议使用默认值。   maxWaitMillis 当资源池连接用尽后，调用者的最大等待时间（单位为毫秒）。 -1（表示永不超时） 不建议使用默认值。   testOnBorrow 向资源池借用连接时是否做连接有效性检测（ping）。检测到的无效连接将会被移除。 false 业务量很大时候建议设置为false，减少一次ping的开销。   testOnReturn 向资源池归还连接时是否做连接有效性检测（ping）。检测到无效连接将会被移除。 false 业务量很大时候建议设置为false，减少一次ping的开销。   jmxEnabled 是否开启JMX监控 true 建议开启，请注意应用本身也需要开启。    空闲Jedis对象检测由下列四个参数组合完成。……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/JedisPool%E8%B5%84%E6%BA%90%E6%B1%A0%E4%BC%98%E5%8C%96/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/jtopo%E6%8A%A5Uncaught-DOMException-Failed-to-execute-getImageData-on-CanvasRenderingContext2D%E9%94%99%E8%AF%AF%E8%A7%A3%E5%86%B3/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            jtopo报Uncaught DOMException: Failed to execute ‘getImageData‘ on ‘CanvasRenderingContext2D‘错误解决
jtopo官方demo，告警 node的图片是可以变红色的，但是复制下来的代码并没有变红，
F12打开浏览器，看到错误Uncaught DOMException: Failed to execute ‘getImageData‘ on ‘CanvasRenderingContext2D‘
找到解决方案，使用VsCode，下载一个叫Live Server插件，安装好以后使用Live Server打开文件。
然后topo图展示就正常了，带告警的node可以正常展示其他颜色。
问题原因是图片存储在本地时，是默认没有域名的，用getImageData方法时，浏览器会判定为跨域而报错。
 后记：我在写这篇文档的时候，想截图浏览器的控制台的错误，但是这个错误就没有再出现了，不知道为什么。
 参考文档：https://blog.csdn.net/Treeee_/article/details/111996118……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/jtopo%E6%8A%A5Uncaught-DOMException-Failed-to-execute-getImageData-on-CanvasRenderingContext2D%E9%94%99%E8%AF%AF%E8%A7%A3%E5%86%B3/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/jvm/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            JVM结构 堆 1.8以后，持久代变成了元空间
虚拟机栈 创建线程时会创建虚拟机栈
调用方法时会创建栈帧
操作数栈是存放临时数据的地方
本地方法栈 就是环境自带的方法，本地方法，C语言实现的方法
程序计数器 记录线程的执行顺序等，如果线程恢复或者争抢资源，可以用来计数
方法区 方法区不是物理的区，是一个逻辑说法的区
工具 jinfo ……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/jvm/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/JVM%E5%AD%A6%E4%B9%A002-%E8%99%9A%E6%8B%9F%E6%9C%BA%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%BB%93%E6%9E%84/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            JVM学习02-虚拟机的基本结构 1.虚拟机的基本结构 虚拟机的结构可以参考 java虚拟机规范 进行理解
 类加载子系统  加载类信息（class）到方法区
 方法区  存放类信息、运行时常量池信息（字符串和数字常量）
 java堆  虚拟机启动时建立的内存工作区域，存放几乎所有java对象实例，所有线程共享。
 直接内存（NIO）  java堆外的直接向系统申请的内存，可以由java的NIO库进行操作。速度优于java堆，适用于频繁读写，不受Xmx最大内存限制，受操作系统最大内存限制
 垃圾回收系统  可以对方法区、java堆和直接内在进行回收。重点回收java堆。
 java栈  每个java虚拟机线程都有一个私有的java栈，在线程被创建的时候创建。java栈中保存着栈帧信息，还保存着局部变量、方法参数，与java方法的调用 、返回密切相关。
 本地方法栈  java虚拟机的重要扩展，本地方法（通常C编写 ）
 Program Counter 程序计数器/PC寄存器  程序计数器也是线程私有空间。
 执行引擎  核心组件，执行虚拟机字节码。
2.堆空间结构 堆空间分为新生代和老年代
  新生代：新生对象或年龄不大的对象
  eden区
对象首先分配在eden区，新生代回收后，如果对象还存活，则会进入 s0或者s1区
  s0区（from区)和s1区（to区），大小相等的两块，可以互换角色的内存空间
每经一次新生代回收，存活的对象的年龄会加1，达到一定条件后会被认为是老年对象进入老年区。
（问题，判定老年对象的条件是什么）
    老年代
  堆、方法区、栈的关系
3.函数调用与java栈 线程的执行的基本行为是函数调用，每次函数调用的数据都是通过java栈传递。java栈的主要内容是栈帧，每次函数调用都会有栈帧压入java栈，函数调用结束栈帧被弹出java栈。
函数返回时，栈帧从java栈中弹出。java方法有两种返回函数的方式，一种是return，一种是抛出异常。一个栈帧中至少要包含局部变量表、操作数栈和栈帧数据区几个部分。
由于每次函数调用都会生成对应的栈帧，所以会占用栈空间，因此，如果栈空间不足，那函数调用无法继续进行下去，当请求的栈尝试大于最大可用栈深度时，系统就会抛出StackOverFlowError栈溢出错误。可以使用参数 -Xss来指定线程的最大栈空间，这个参数决定了函数的最大的调用深度。函数嵌套调用的层次，取决于栈空间的大小，栈越大，函数就可以嵌套越多次。
  局部变量表
保存函数的参数及局部变量。
ps：相同的栈容量下，局部变量少的函数，可以支持更深的函数调用，如果函数的参数和局部变量较多，会使局部变量表膨胀，导致函数嵌套次数变少。
栈帧中的局部量变量中的槽位是可以重用的，局部变量过了作用域，后续新申请的局部变量可能会复用过作用域的局部变量的槽位，用以节约资源。
以下代码来测试局部变量与垃圾回收关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64  /** * * 测试变量的GC结果 * 执行时增加jvm参数 -XX:+PrintGC * @author domino * @date 2021/5/17 */ public class TestLocalVariable { /** * 有引用指向变量不会被回收 */ public void localVarGc1() { byte[] a = new byte[6 * 1024 * 1024]; System.……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/JVM%E5%AD%A6%E4%B9%A002-%E8%99%9A%E6%8B%9F%E6%9C%BA%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%BB%93%E6%9E%84/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/JVM%E5%AD%A6%E4%B9%A003-%E5%B8%B8%E7%94%A8Java%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%8F%82%E6%95%B0/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            JVM学习03-常用Java虚拟机参数 一、垃圾回收日志参数   -XX:+PrintGC 打印简单GC日志
只要GC就会打印日志。
1 2  [GC 1023K-&gt;565K(5632K), 0.0012699 secs] #日志说明：GC前堆空间使用量为1023K，GC后堆空间使用量为565K，当前可用堆空间的总和为5632K，本次GC时间为0.0012699 secs     -XX:+PrintGCDetails 打印详细GC日志
[GC[DefNew:9791K-&gt;9791K(9792K),0.0000350 secs][Tenured:16632K-&gt;13533K(21888K),0.4063120 secs] 26424K-&gt;13533k(31680K),[Perm : 2583k-&gt;2583k(21248K)],0.4064710 secs [Times:user=0.41 sys=0.00, real=0.40 secs]] #日志说明： #[DefNew:9791K-&gt;9791K(9792K),0.0000350 secs] 新生代回收 #[Tenured:16632K-&gt;13533K(21888K),0.4063120 secs] 老年代回收 #26424K-&gt;13533k(31680K) 堆回收:由GC前的26M到GC后的13M，堆总可用变为31M，但是这里要注意，堆回收了13M，但是老年代只回收了3M，剩下的其实是新生代的内存回收，虽然日志里面显示着新生代没有回收，但是实际是被清空了的。 #[Perm : 2583k-&gt;2583k(21248K)] 永久区回收 #以上的日志是书上的日志，我自己的没有老年代和永久区的日志，而且年轻代的名称也不是DefNew，而是PSYoungGen [GC (Allocation Failure) [PSYoungGen: 2047K-&gt;512K(2560K)] 2047K-&gt;520K(9728K), 0.0009979 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 6 Heap PSYoungGen total 2560K, used 1243K [0x00000007bfd00000, 0x00000007c0000000, 0x00000007c0000000) eden space 2048K, 35% used [0x00000007bfd00000,0x00000007bfdb6e98,0x00000007bff00000) from space 512K, 100% used [0x00000007bff00000,0x00000007bff80000,0x00000007bff80000) to space 512K, 0% used [0x00000007bff80000,0x00000007bff80000,0x00000007c0000000) ParOldGen total 7168K, used 8K [0x00000007bf600000, 0x00000007bfd00000, 0x00000007bfd00000) object space 7168K, 0% used [0x00000007bf600000,0x00000007bf602000,0x00000007bfd00000) Metaspace used 2709K, capacity 4486K, committed 4864K, reserved 1056768K class space used 289K, capacity 386K, committed 512K, reserved 1048576K   -XX:+PrintHeapAtGC 分别在每次GC前后分别打印堆信息。效果如下
{Heap before GC invocations=1 (full 0): PSYoungGen total 2560K, used 2047K [0x00000007bfd00000, 0x00000007c0000000, 0x00000007c0000000) eden space 2048K, 99% used [0x00000007bfd00000,0x00000007bfeffff0,0x00000007bff00000) from space 512K, 0% used [0x00000007bff80000,0x00000007bff80000,0x00000007c0000000) to space 512K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007bff80000) ParOldGen total 7168K, used 0K [0x00000007bf600000, 0x00000007bfd00000, 0x00000007bfd00000) object space 7168K, 0% used [0x00000007bf600000,0x00000007bf600000,0x00000007bfd00000) Metaspace used 2700K, capacity 4486K, committed 4864K, reserved 1056768K class space used 288K, capacity 386K, committed 512K, reserved 1048576K [GC (Allocation Failure) [PSYoungGen: 2047K-&gt;512K(2560K)] 2047K-&gt;520K(9728K), 0.……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/JVM%E5%AD%A6%E4%B9%A003-%E5%B8%B8%E7%94%A8Java%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%8F%82%E6%95%B0/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/JVM%E5%AD%A6%E4%B9%A004-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%A6%82%E5%BF%B5%E4%B8%8E%E7%AE%97%E6%B3%95/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            JVM学习04-垃圾回收概念与算法 一、常用的垃圾回收算法   引用计数法
为对象配备一个整型计数器，只要有任何一个对象引用了这个对象，这个对象的计数器就加1，引用失效时引用计数器就减1。只要对象的引用计数器的值为0，则对象就不可能再被使用。
问题：
  无法处理循环引用的情况。
  每次因引用产生和消除，都需要伴随一个加法和减法操作，对系统性能会有一定影响。
  Java虚拟机并未选择此算法作为垃圾回收算法。
  标记清除法（Mark-Sweep）
标记清除算法将垃圾回收分为两个阶段：标记阶段和清除阶段。
 标记阶段，通过根节点标记所有的从根节点开始的可达对象。未被标记的对象就是未被引用的垃圾对象 清除阶段，清除所有未被标记的对象。  问题：回收后的空间不连续，会产生空间碎片。在对象的堆空间分配过程中，尤其是大对象的内在分配，不连续内在空间的工作效率要低于连续空间。
  复制算法
将原有的内在空间分为两块，每次只使用其中一块，在垃圾回收时，将正在使用的内存中存活的对象复制到未使用的内在块中，之后，清除正在使用的内存块中的所有对象，交换两个内存的角色，完成垃圾回收。
  优点：效率高、没碎片
效率高体现在：如果垃圾多，要复制的存活对象相对会少。
没碎片体现在：对象在垃圾回收过程中被统一复制到新内存空间中，所以可确保没碎片。
  缺点：系统内存折半
  在Java新生代串行垃圾回收器中，使用了复制算法思想。新生代分为eden、from、to三个部分。from和to可视为用于复制的两块大小相同、地位相等且可进行角色互换的空间块。
from和to空间也被称为survivor空间，即幸存者空间用于存放未被回收的对象，如下图。
 新生代 ：存放年轻对象的堆空间。年轻对象指刚刚创建的或经历垃圾回收次数不多的对象。 老年代：存放老年对象的堆空间。老年对象就是经历多次垃圾回收依然存活的对象。  垃圾加收时，eden空间中存活的对象，会被复制到未使用的survivor空间中(假设是to )，正在使用的survivor空间(假设是from) 中的年轻对象也会被复制到to空间中(大对象或者老年对象会直接进入老年代，如果to空间满了，对象也会直接进入老年代)。此时 eden和from空间中的剩余对象就是垃圾对象，可以直接清空，to空间则存放此次回收后的存活对象。
这种改进的复制算法既保证了空间的连续性，又避免了大量的内存空间的浪费。
PS:复制算法比较适合用于新生代。因为在新生代，垃圾对象通常会多于存活对象，复制算法的效果会比较好。
  标记压缩法
老年代大部分对象是存活对象，标记压缩法是一种老年代的回收算法，先从根节点开始对所有可达对象做一次标记，之后将所有的存活对象压缩到内存的一端，之后清理边界外所有的空间。
优点：既避免了碎片的产生，又不需要两块相同的内在空间，性价比较高。
  分代算法
即前面的汇总，不同的内存区间使用不同的回收算法。
新生代回收频率高，每次回收耗时短
老年代回收频率低，耗时长。
为了支持高频率的新生代回收，虚拟机可能使用一种叫卡表的数据结构。卡表为一个比特位集合，每个比特位表示老年代区域中所有对象是否持有新生代的对象引用。这样在新生代GC时，可以不用花大量时间扫描所有老年代对象来确定每个对象的引用关系，先扫描卡表，只有卡表的标记位为1时，才需要扫描特定老年代对象。卡表位为0的所在区域必定不含有新生代对象引用。
  分区算法
分区算法将整个堆空间划分为连续不同的小区间，每个小区间都独立使用独立回收。
优点：可以控制一次回收多少个小区间，更好控制GC产生的停顿时间。每次合理地回收若干个小区间，而不是整个堆空间。（有没有使用场景？比如什么版本的的虚拟机这么用）  二、判断可触及性 可触及性包含三种状态
 可触及：从根节点开始，可以到达这个对象 可复活:对象的所有引用都被释放，但对象有可能在finalize()函数中复活。 不可触及的：对象的finalize()函数被调用，并且没有复活，就会进入不可触及状态。  以上三种状态中，只有对象不可触及时，才可以被回收。
  对象复活
 finalize方法至多由GC执行一次(用户当然可以手动调用对象的finalize方法，但并不影响GC对finalize的行为) finalize()函数可能引用外泄，无意中复活对象 finalize()被系统调用，调用时间不明确，推荐在try-catch-finally中进行资源释放。  public class CanReliveObj { public static CanReliveObj obj; public static void main(String[] args) throws InterruptedException { obj = new CanReliveObj(); obj = null; //这里调用 gc以后，会调用到finalize()方法，将obj对象复活 System.gc(); Thread.sleep(1000); if (obj == null) { System.out.println(&quot;obj 是 null&quot;); } else { System.out.println(&quot;obj 可用&quot;); } System.out.println(&quot;第二次gc&quot;); obj = null; // finalize()方法这次不会被调用，所以这回 obj对象真正被回收 System.gc(); Thread.sleep(1000); if (obj == null) { System.……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/JVM%E5%AD%A6%E4%B9%A004-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%A6%82%E5%BF%B5%E4%B8%8E%E7%AE%97%E6%B3%95/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/JVM%E5%AD%A6%E4%B9%A005-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E5%99%A8%E5%92%8C%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            JVM学习05-垃圾回收器和内存分配 一、串行回收器 串行回收器成熟、历经生产考验、极为高效
jdk中最基本的垃圾回收器之一
特点：
  仅使用单线程进行垃圾回收
  独占式回收：stop the world，回收时java应用程序中的线程都需要暂停等垃圾回收完成。
    新生代串行回收
新生代串行回收器使用复制算法，实现相对简单、逻辑处理高效且没有线程切换的开销。
使用-XX:+UseSerialGC参数可以指定使用新生代串行收集器和老年代串行收集器。当虚拟机在Client模式下运行时，它是默认的垃圾收集器。
输出GC日志格式为
[GC 0.844:[DefNew:]]   老年代串行回收器
老年代串行回收器使用标记压缩算法，也是串行的、独占式的垃圾回收器，回收比新生代使用更长时间。
可以与多种新生代回收器配合使用：
 -XX:+UseSerialGC:新、老都使用串行回收 -XX:+UseParNewGC:新生代使用ParNew回收器，老年代使用串行 -XX:+UseParalleelGC:新生代使用ParallelGC回收器，老年代使用串行  [Full GC 0.844:[Tenured: xxxk-&gt;xxxk(xxxk)]]   二、并行回收器 使用多个线程进行垃圾回收，对于并行 能力强的计算机，可以有效缩减回收时间。
  新生代ParNew回收器
将串行回收器多线程化，回收策略、算法、参数与新生代串行回收器一样（复制算法）。也独占，也STW，CPU并发强停顿时间就短，单CPU或CPU并发能力弱表现可能比串行回收还差。
开启使用以下参数：
 -XX:+UseParNewGC: 新生代使用ParNew回收器，老年代使用串行回收 -XX:+UseConcMarkSweepGC: 新生代使ParNew回收器，老年代使用CMS  回收线程数量可以使用-XX:ParallelGCThreads 参数指定。如-XX:ParallelGCThreads=8 
  一般最好与CPU数量相当，避免过多的线程数影响回收性能。
  默认情况下当CPU数量小于8个时，ParallelGCThreads的值等于CPU数量。
  当CPU数大于8个时，ParallelGCThreads的值等于 3+((5*CPU_COUNT)/8)
  日志格式：
1  [GC 0.834: [ParNew: xxxK -&gt; xxxK(xxxK)]]     新生代ParallelGC回收器
新生代ParalelGC回收器也是复制算法、多线程、独占式。
区别：
 非常关注系统的吞量  使用方式：
 -XX:+UseParallelGC: 新生代使用ParallelGC回收器，老年代使用串行回收器。 -XX:+UseParallelOldGC: 新生代使用ParallelGC回收器，老年代使用ParallelOldGC回收器。  控制系统吞量的两个重要参数，这两个参数相互矛盾的。
 -XX:MaxGCPauseMilis:设置最大垃圾回收停顿时间。值是一个大于0的整数，ParallelGC在工作时会调整Java堆大小或其他一些参数，尽可能地把停顿时间控制在MaxGCPauseMilis以内。  如果把这个值设置的很小，为了达到预期的停顿时间，虚拟机可能会使用一个小较小的堆(小堆比大堆回收快)，这将导致垃圾回收变得很频繁，从而增加了垃圾回收总时间，降低了吞吐量。 默认情况下，VM没有暂停时间目标值。GC的暂停时间主要取决于堆中实时数据的数量与实时数据量。   -XX:GCTimeRatio：设置吞量大小。值是从0到100的整数，如果值设置为n，则系统垃圾收集时间不超过 1/(1+n)，默认值为99(可以增加-XX:+PrintFlagsFinal参数查看该值)  ParallelGC回收器与ParNew回收器另一个不同是，ParallelGC可以使用 -XX:+UseAdaptiveSizePolicy打开自适应GC调节策略。这种模式下，新生代大小、eden与survivior的比例、晋升老年代的对象年龄等参数会被自动调整，以达到在堆大小、吞吐量和停顿之间的平衡点。手工调优比较困难的场合，可以直接使用这种自适应的方式，仅指定虚拟机的最大堆、目标吞吐量和停顿时间，让虚拟机自己完成调优工作。这个参数的默认是开着的。
ParalelGC的回收日志格式：
[GC[PSYoungGen: xxxK -&gt; xxxK(xxxk)]   老年代ParallelOldGC回收器
也是多线程并发的收集器。
使用方式：-XX+UseParallelOldGC
回收日志格式：
1  [FULL GC [PSYoungGen:xxK-&gt;xxK(xxK)][ParOldGen:xxK-&gt;xxK(xxK)]]     三、CMS回收器 CMS回收器主要关注于系统的停顿时间。CMS是 Concurrent Mark Sweep的缩写，意为并发标记清除，使用的是标记清除算法，且多线程并行回收。
CMS 不会对新生代做垃圾回收，默认只针对老年代进行垃圾回收。此外，CMS 还可以开启对永久代的垃圾回收（或元空间），避免由于 PermGen 空间耗尽带来 Full GC。
  CMS主要工作步骤……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/JVM%E5%AD%A6%E4%B9%A005-%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E5%99%A8%E5%92%8C%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D/">阅读全文</a></p>
    </article>
    
    <article class="post">
        <header>
            <h1 class="post-title">
                <a href="http://www.shutdown.cn/post/linux-Operation-not-permitted/" title=""></a>
            </h1>
        </header>
        <date class="post-meta meta-date">
            1年1月1日
        </date>
        
        <div class="post-content">
            linux Operation not permitted 阿里云的服务器被挖矿了，要删除免密登录配置，root用户想修改或删除 authorized_keys，但报了Operation not permitted的错误。
首先想到的是没有操作权限所以chmod 777 ，但是仍报linux Operation not permitted的错误。网上查lsattr可用来查看文件的属性，如果有ia属性，就是保护状态，那么我们需要使用chattr更改文件属性，去掉这两个属性。
chattr -ia authorized_keys 如果想恢复保护，可以执行命令再增加保护。
chattr +ia authorized_keys ……
        </div>
        <p class="readmore"><a href="http://www.shutdown.cn/post/linux-Operation-not-permitted/">阅读全文</a></p>
    </article>
    
    



<ol class="page-navigator">
    
    <li class="prev">
        <a href="http://www.shutdown.cn/">上一页</a>
    </li>
    

    
    <li >
        <a href="http://www.shutdown.cn/">1</a>
    </li>
    
    <li  class="current">
        <a href="http://www.shutdown.cn/page/2/">2</a>
    </li>
    
    <li >
        <a href="http://www.shutdown.cn/page/3/">3</a>
    </li>
    
    <li >
        <a href="http://www.shutdown.cn/page/4/">4</a>
    </li>
    
    <li >
        <a href="http://www.shutdown.cn/page/5/">5</a>
    </li>
    

    
    <li class="next">
        <a href="http://www.shutdown.cn/page/3/">下一页</a>
    </li>
    
</ol>



</div>

                </div>

                <div id="secondary">
    <section class="widget">
        <form id="search" action='http://www.shutdown.cn/search/' method="get" accept-charset="utf-8" target="_blank" _lpchecked="1">
      
      <input type="text" name="q" maxlength="20" placeholder="Search">
      <input type="hidden" name="sitesearch" value="http://www.shutdown.cn">
      <button type="submit" class="submit icon-search"></button>
</form>
    </section>
    
    <section class="widget">
        <h3 class="widget-title">最近文章</h3>
<ul class="widget-list">
    
    <li>
        <a href="http://www.shutdown.cn/post/lvs_keepalive_jenkins2_ha/" title="lvs&#43;keepalive配置Jenkins2高可用 ">lvs&#43;keepalive配置Jenkins2高可用 </a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/markdown/" title="markdown语法">markdown语法</a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/first/" title="hello world">hello world</a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/apt-get-update%E5%87%BA%E7%8E%B0NO_PUBKEY%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/" title=""></a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/BigKey/" title=""></a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/bigkey%E5%88%A0%E9%99%A4%E9%97%AE%E9%A2%98/" title=""></a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/cachecloud%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2/" title=""></a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/copy-on-write/" title=""></a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/Cpu%E6%8C%96%E7%9F%BFRedis%E7%AB%9F%E6%98%AF%E5%86%85%E9%AC%BC/" title=""></a>
    </li>
    
    <li>
        <a href="http://www.shutdown.cn/post/docker-%E5%90%AF%E5%8A%A8-zookeeper/" title=""></a>
    </li>
    
</ul>
    </section>

    

    <section class="widget">
        <h3 class="widget-title">分类</h3>
<ul class="widget-list">
    
    <li><a href="http://www.shutdown.cn/categories/cicd/">cicd (1)</a></li>
    
    <li><a href="http://www.shutdown.cn/categories/%E5%88%86%E7%B1%BB/">分类 (2)</a></li>
    
</ul>
    </section>

    <section class="widget">
        <h3 class="widget-title">标签</h3>
<div class="tagcloud">
    
</div>
    </section>

    

    <section class="widget">
        <h3 class="widget-title">其它</h3>
        <ul class="widget-list">
            <li><a href="http://www.shutdown.cn/index.xml">文章 RSS</a></li>
        </ul>
    </section>
</div>
            </div>
        </div>
    </div>
    <footer id="footer">
    <div class="container">
        &copy; 2013-2022版权所有：<a href="http://www.beian.miit.gov.cn">京ICP备13019191号-1</a> <a href="http://www.shutdown.cn">刹宕博客 By 孟江莱</a>.
        Powered by <a rel="nofollow noreferer noopener" href="https://gohugo.io" target="_blank">Hugo</a>.
        <a href="https://www.flysnow.org/" target="_blank">Theme</a> based on <a href="https://github.com/flysnow-org/maupassant-hugo" target="_blank">maupassant</a>.
    </div>
</footer>



<a id="rocket" href="#top"></a>
<script type="text/javascript" src='/js/totop.js?v=0.0.0' async=""></script>






</body>

</html>